In [1]:
#pip install --upgrade pandas
In [2]:
#pip install --upgrade pandas-datareader
In [3]:
from pandas_datareader import data
import pandas as pd
import numpy as np
import datetime
get_ipython().run_line_magic('matplotlib', 'inline')
import seaborn as sns
sns.set_style('whitegrid')
import matplotlib.pyplot as plt
import statistics
import plotly.graph_objects as go
In [4]:
# Ignore error messages
import warnings
warnings.filterwarnings("ignore")

Exploratory Data Analysis:¶

In [5]:
# Data Exploring : Missing Values
def find_missing_percent(data):
    """
    Returns dataframe containing the total missing values and percentage of total
    missing values of a column.
    """
    miss_df = pd.DataFrame({'ColumnName':[],'TotalMissingVals':[],'PercentMissing':[]})
    for col in list(data.columns):
        sum_miss_val = data[col].isnull().sum()
        percent_miss_val = round((sum_miss_val/data.shape[0])*100,2)
        missinginfo = {"ColumnName" : col, "TotalMissingVals" : sum_miss_val, "PercentMissing" : percent_miss_val}
        miss_df = miss_df.append(missinginfo, ignore_index = True)
    
    miss_df = miss_df[miss_df["PercentMissing"] > 0.0]
    miss_df = miss_df.reset_index(drop = True)
    return miss_df
In [6]:
start_date = datetime.datetime(2015,1,1)
end_date = datetime.datetime(2021,1,1)

Describe the meaning of the columns

  • High column: the highest selling price of the day
  • Low column: the lowest selling price of the day
  • Open column: price at the beginning of the opening
  • Close column: closing price at closing
  • Volume: trading volume (volume) is the number of shares traded during the day

Pick one stock and do the EDA

In [7]:
features = ['Open', 'High', 'Low', 'Close', 'Volume']

AAPL¶

In [8]:
AAPL = pd.read_csv('AAPL.csv')
AAPL.head()
Out[8]:
Date Open High Low Close Adj Close Volume
0 2015-01-02 27.847500 27.860001 26.837500 27.332500 24.603203 212818400
1 2015-01-05 27.072500 27.162500 26.352501 26.562500 23.910093 257142000
2 2015-01-06 26.635000 26.857500 26.157499 26.565001 23.912340 263188400
3 2015-01-07 26.799999 27.049999 26.674999 26.937500 24.247646 160423600
4 2015-01-08 27.307501 28.037500 27.174999 27.972500 25.179296 237458000
In [9]:
AAPL.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1511 entries, 0 to 1510
Data columns (total 7 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Date       1511 non-null   object 
 1   Open       1511 non-null   float64
 2   High       1511 non-null   float64
 3   Low        1511 non-null   float64
 4   Close      1511 non-null   float64
 5   Adj Close  1511 non-null   float64
 6   Volume     1511 non-null   int64  
dtypes: float64(5), int64(1), object(1)
memory usage: 82.8+ KB
In [10]:
AAPL.describe()
Out[10]:
Open High Low Close Adj Close Volume
count 1511.000000 1511.000000 1511.000000 1511.000000 1511.000000 1.511000e+03
mean 48.087819 48.604072 47.585723 48.117598 46.199344 1.459379e+08
std 25.091675 25.473172 24.677915 25.091074 25.349878 7.142285e+07
min 22.500000 22.917500 22.367500 22.584999 20.914917 4.544800e+07
25% 29.708750 29.981250 29.561250 29.814999 27.386384 9.743980e+07
50% 41.362499 41.882500 40.907501 41.314999 39.531799 1.280424e+08
75% 54.127501 54.834999 53.375000 53.938751 52.017620 1.754606e+08
max 138.050003 138.789993 134.339996 136.690002 135.068588 6.488252e+08
In [11]:
# Data Exploring : Missing Values
miss_df = find_missing_percent(AAPL)
print(f"Number of columns with missing values: {miss_df.shape}")
miss_features = miss_df["ColumnName"].values
display(miss_df)
print(f"Total Missing Features {miss_features}")
Number of columns with missing values: (0, 3)
ColumnName TotalMissingVals PercentMissing
Total Missing Features []
In [12]:
AAPL['Close'].plot(figsize=(12,4)).set(title = "The distribution plot of close values for AAPL stock")
display()
In [13]:
plt.subplots(figsize=(20,10))
 
for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sns.distplot(AAPL[col])
plt.show()
In [14]:
plt.subplots(figsize=(20,10))

for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sns.boxplot(AAPL[col])
plt.show()
In [15]:
fig = go.Figure(data=[go.Candlestick(x=AAPL['Date'],
                open=AAPL['Open'], high=AAPL['High'],
                low=AAPL['Low'], close=AAPL['Close'])
                     ])

fig.update_layout(xaxis_rangeslider_visible=False)
fig.show()

AMZN¶

In [16]:
AMZN = pd.read_csv('AMZN.csv')
AMZN.head()
Out[16]:
Date Open High Low Close Adj Close Volume
0 2015-01-02 15.6290 15.7375 15.3480 15.4260 15.4260 55664000
1 2015-01-05 15.3505 15.4190 15.0425 15.1095 15.1095 55484000
2 2015-01-06 15.1120 15.1500 14.6190 14.7645 14.7645 70380000
3 2015-01-07 14.8750 15.0640 14.7665 14.9210 14.9210 52806000
4 2015-01-08 15.0160 15.1570 14.8055 15.0230 15.0230 61768000
In [17]:
AMZN.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1511 entries, 0 to 1510
Data columns (total 7 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Date       1511 non-null   object 
 1   Open       1511 non-null   float64
 2   High       1511 non-null   float64
 3   Low        1511 non-null   float64
 4   Close      1511 non-null   float64
 5   Adj Close  1511 non-null   float64
 6   Volume     1511 non-null   int64  
dtypes: float64(5), int64(1), object(1)
memory usage: 82.8+ KB
In [18]:
AMZN.describe()
Out[18]:
Open High Low Close Adj Close Volume
count 1511.000000 1511.000000 1511.000000 1511.000000 1511.000000 1.511000e+03
mean 68.880995 69.597756 68.059404 68.861214 68.861214 8.628262e+07
std 39.643048 40.145517 39.037404 39.599778 39.599778 4.447806e+07
min 14.314000 14.539500 14.262500 14.347500 14.347500 1.762600e+07
25% 36.331001 36.537501 36.053751 36.393749 36.393749 5.711500e+07
50% 60.132999 60.274502 59.425999 59.791500 59.791500 7.465600e+07
75% 91.448749 92.278000 90.615250 91.480999 91.480999 1.019910e+08
max 177.350006 177.612503 174.334503 176.572495 176.572495 4.771220e+08
In [19]:
# Data Exploring : Missing Values
miss_df = find_missing_percent(AMZN)
print(f"Number of columns with missing values: {miss_df.shape}")
miss_features = miss_df["ColumnName"].values
display(miss_df)
print(f"Total Missing Features {miss_features}")
Number of columns with missing values: (0, 3)
ColumnName TotalMissingVals PercentMissing
Total Missing Features []
In [20]:
AMZN['Close'].plot(figsize=(12,4)).set(title = "The distribution plot of close values for AMZN stock")
display()
In [21]:
plt.subplots(figsize=(20,10))
 
for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sns.distplot(AMZN[col])
plt.show()
In [22]:
plt.subplots(figsize=(20,10))

for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sns.boxplot(AMZN[col])
plt.show()
In [23]:
fig = go.Figure(data=[go.Candlestick(x=AMZN['Date'],
                open=AMZN['Open'], high=AMZN['High'],
                low=AMZN['Low'], close=AMZN['Close'])
                     ])

fig.update_layout(xaxis_rangeslider_visible=False)
fig.show()

NFLX¶

In [24]:
NFLX = pd.read_csv('NFLX.csv')
NFLX.head()
Out[24]:
Date Open High Low Close Adj Close Volume
0 2015-01-02 49.151428 50.331429 48.731430 49.848572 49.848572 13475000
1 2015-01-05 49.258572 49.258572 47.147144 47.311428 47.311428 18165000
2 2015-01-06 47.347141 47.639999 45.661430 46.501431 46.501431 16037700
3 2015-01-07 47.347141 47.421429 46.271427 46.742859 46.742859 9849700
4 2015-01-08 47.119999 47.835712 46.478573 47.779999 47.779999 9601900
In [25]:
NFLX.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1511 entries, 0 to 1510
Data columns (total 7 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Date       1511 non-null   object 
 1   Open       1511 non-null   float64
 2   High       1511 non-null   float64
 3   Low        1511 non-null   float64
 4   Close      1511 non-null   float64
 5   Adj Close  1511 non-null   float64
 6   Volume     1511 non-null   int64  
dtypes: float64(5), int64(1), object(1)
memory usage: 82.8+ KB
In [26]:
NFLX.describe()
Out[26]:
Open High Low Close Adj Close Volume
count 1511.000000 1511.000000 1511.000000 1511.000000 1511.000000 1.511000e+03
mean 242.401258 246.232520 238.427909 242.517075 242.517075 1.071030e+07
std 136.995001 139.306111 134.564590 137.059678 137.059678 8.266190e+06
min 46.021427 46.785713 45.264286 45.547142 45.547142 1.144000e+06
25% 110.110000 112.040001 107.459999 110.114998 110.114998 5.593000e+06
50% 201.949997 204.380005 198.089996 202.679993 202.679993 8.315600e+06
75% 353.600006 359.065002 348.074997 353.384995 353.384995 1.302200e+07
max 567.979980 575.369995 541.000000 556.549988 556.549988 1.045009e+08
In [27]:
# Data Exploring : Missing Values
miss_df = find_missing_percent(NFLX)
print(f"Number of columns with missing values: {miss_df.shape}")
miss_features = miss_df["ColumnName"].values
display(miss_df)
print(f"Total Missing Features {miss_features}")
Number of columns with missing values: (0, 3)
ColumnName TotalMissingVals PercentMissing
Total Missing Features []
In [28]:
NFLX['Close'].plot(figsize=(12,4)).set(title = "The distribution plot of close values for NFLX stock")
display()
In [29]:
plt.subplots(figsize=(20,10))
 
for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sns.distplot(NFLX[col])
plt.show()
In [30]:
plt.subplots(figsize=(20,10))

for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sns.boxplot(NFLX[col])
plt.show()
In [31]:
fig = go.Figure(data=[go.Candlestick(x=NFLX['Date'],
                open=NFLX['Open'], high=NFLX['High'],
                low=NFLX['Low'], close=NFLX['Close'])
                     ])

fig.update_layout(xaxis_rangeslider_visible=False)
fig.show()

GOOG¶

In [32]:
GOOG = pd.read_csv('GOOG.csv')
GOOG.head()
Out[32]:
Date Open High Low Close Adj Close Volume
0 2015-01-02 26.378078 26.490770 26.133251 26.168653 26.168653 28951268
1 2015-01-05 26.091366 26.144720 25.582764 25.623152 25.623152 41196796
2 2015-01-06 25.679497 25.738087 24.983908 25.029282 25.029282 57998800
3 2015-01-07 25.280592 25.292759 24.914099 24.986401 24.986401 41301082
4 2015-01-08 24.831326 25.105074 24.482782 25.065184 25.065184 67071641
In [33]:
GOOG.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1511 entries, 0 to 1510
Data columns (total 7 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Date       1511 non-null   object 
 1   Open       1511 non-null   float64
 2   High       1511 non-null   float64
 3   Low        1511 non-null   float64
 4   Close      1511 non-null   float64
 5   Adj Close  1511 non-null   float64
 6   Volume     1511 non-null   int64  
dtypes: float64(5), int64(1), object(1)
memory usage: 82.8+ KB
In [34]:
GOOG.describe()
Out[34]:
Open High Low Close Adj Close Volume
count 1511.000000 1511.000000 1511.000000 1511.000000 1511.000000 1.511000e+03
mean 50.406994 50.894590 49.936483 50.434176 50.434176 3.475792e+07
std 15.349151 15.558849 15.184162 15.375751 15.375751 1.676414e+07
min 24.664783 24.730902 24.311253 24.560070 24.560070 6.936000e+06
25% 37.648001 37.949551 37.317001 37.592999 37.592999 2.484100e+07
50% 51.399502 52.102501 50.845001 51.435501 51.435501 3.050400e+07
75% 59.783249 60.244749 59.341751 59.856248 59.856248 3.946600e+07
max 91.225998 92.360001 91.132500 91.399498 91.399498 2.232980e+08
In [35]:
# Data Exploring : Missing Values
miss_df = find_missing_percent(GOOG)
print(f"Number of columns with missing values: {miss_df.shape}")
miss_features = miss_df["ColumnName"].values
display(miss_df)
print(f"Total Missing Features {miss_features}")
Number of columns with missing values: (0, 3)
ColumnName TotalMissingVals PercentMissing
Total Missing Features []
In [36]:
GOOG['Close'].plot(figsize=(12,4)).set(title = "The distribution plot of close values for GOOG stock")
display()
In [37]:
plt.subplots(figsize=(20,10))
 
for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sns.distplot(GOOG[col])
plt.show()
In [38]:
plt.subplots(figsize=(20,10))

for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sns.boxplot(GOOG[col])
plt.show()
In [39]:
fig = go.Figure(data=[go.Candlestick(x=GOOG['Date'],
                open=GOOG['Open'], high=GOOG['High'],
                low=GOOG['Low'], close=GOOG['Close'])
                     ])

fig.update_layout(xaxis_rangeslider_visible=False)
fig.show()

TSLA¶

In [40]:
TSLA = pd.read_csv('TSLA.csv')
TSLA.head()
Out[40]:
Date Open High Low Close Adj Close Volume
0 2015-01-02 14.858000 14.883333 14.217333 14.620667 14.620667 71466000
1 2015-01-05 14.303333 14.433333 13.810667 14.006000 14.006000 80527500
2 2015-01-06 14.004000 14.280000 13.614000 14.085333 14.085333 93928500
3 2015-01-07 14.223333 14.318667 13.985333 14.063333 14.063333 44526000
4 2015-01-08 14.187333 14.253333 14.000667 14.041333 14.041333 51637500
In [41]:
TSLA.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1511 entries, 0 to 1510
Data columns (total 7 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Date       1511 non-null   object 
 1   Open       1511 non-null   float64
 2   High       1511 non-null   float64
 3   Low        1511 non-null   float64
 4   Close      1511 non-null   float64
 5   Adj Close  1511 non-null   float64
 6   Volume     1511 non-null   int64  
dtypes: float64(5), int64(1), object(1)
memory usage: 82.8+ KB
In [42]:
TSLA.describe()
Out[42]:
Open High Low Close Adj Close Volume
count 1511.000000 1511.000000 1511.000000 1511.000000 1511.000000 1.511000e+03
mean 31.055770 31.758800 30.331243 31.111681 31.111681 1.203264e+08
std 37.301391 38.356045 36.204387 37.497484 37.497484 8.888718e+07
min 9.488000 10.331333 9.403333 9.578000 9.578000 1.062000e+07
25% 15.179666 15.392000 14.941333 15.141334 15.141334 6.389475e+07
50% 18.886000 19.224667 18.511333 18.945333 18.945333 9.243900e+07
75% 23.171333 23.492668 22.817334 23.165000 23.165000 1.433830e+08
max 233.330002 239.573334 230.373337 235.223328 235.223328 9.140820e+08
In [43]:
# Data Exploring : Missing Values
miss_df = find_missing_percent(TSLA)
print(f"Number of columns with missing values: {miss_df.shape}")
miss_features = miss_df["ColumnName"].values
display(miss_df)
print(f"Total Missing Features {miss_features}")
Number of columns with missing values: (0, 3)
ColumnName TotalMissingVals PercentMissing
Total Missing Features []
In [44]:
TSLA['Close'].plot(figsize=(12,4)).set(title = "The distribution plot of close values for TSLA stock")
display()
In [45]:
plt.subplots(figsize=(20,10))
 
for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sns.distplot(TSLA[col])
plt.show()
In [46]:
plt.subplots(figsize=(20,10))

for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sns.boxplot(TSLA[col])
plt.show()
In [47]:
fig = go.Figure(data=[go.Candlestick(x=TSLA['Date'],
                open=TSLA['Open'], high=TSLA['High'],
                low=TSLA['Low'], close=TSLA['Close'])
                     ])

fig.update_layout(xaxis_rangeslider_visible=False)
fig.show()

Create a new Data-frame, titled "Return". This Data-frame will contain the returns for each stock data that you had crawled above.

In [48]:
list_stocksStr = ['AAPL', 'AMZN', 'NFLX', 'GOOG', 'TSLA']
list_stocks = [AAPL, AMZN, NFLX, GOOG, TSLA]
for data in list_stocks:
    data.index = data.Date
    data = data.drop(['Date'], axis = 1)
In [49]:
stocks = pd.concat(list_stocks, axis =  1, keys = list_stocksStr)
In [50]:
stocks.columns.names = ['Stock Name', 'Stock Info']
stocks.head()
Out[50]:
Stock Name AAPL AMZN ... GOOG TSLA
Stock Info Date Open High Low Close Adj Close Volume Date Open High ... Close Adj Close Volume Date Open High Low Close Adj Close Volume
Date
2015-01-02 2015-01-02 27.847500 27.860001 26.837500 27.332500 24.603203 212818400 2015-01-02 15.6290 15.7375 ... 26.168653 26.168653 28951268 2015-01-02 14.858000 14.883333 14.217333 14.620667 14.620667 71466000
2015-01-05 2015-01-05 27.072500 27.162500 26.352501 26.562500 23.910093 257142000 2015-01-05 15.3505 15.4190 ... 25.623152 25.623152 41196796 2015-01-05 14.303333 14.433333 13.810667 14.006000 14.006000 80527500
2015-01-06 2015-01-06 26.635000 26.857500 26.157499 26.565001 23.912340 263188400 2015-01-06 15.1120 15.1500 ... 25.029282 25.029282 57998800 2015-01-06 14.004000 14.280000 13.614000 14.085333 14.085333 93928500
2015-01-07 2015-01-07 26.799999 27.049999 26.674999 26.937500 24.247646 160423600 2015-01-07 14.8750 15.0640 ... 24.986401 24.986401 41301082 2015-01-07 14.223333 14.318667 13.985333 14.063333 14.063333 44526000
2015-01-08 2015-01-08 27.307501 28.037500 27.174999 27.972500 25.179296 237458000 2015-01-08 15.0160 15.1570 ... 25.065184 25.065184 67071641 2015-01-08 14.187333 14.253333 14.000667 14.041333 14.041333 51637500

5 rows × 35 columns

In [51]:
Return = pd.DataFrame()
Return['AAPL ' + 'value_stock'] = stocks.AAPL.Close.pct_change()
Return['AMZN ' + 'value_stock'] = stocks.AMZN.Close.pct_change()
Return['NFLX ' + 'value_stock'] = stocks.NFLX.Close.pct_change()
Return['GOOG ' + 'value_stock'] = stocks.GOOG.Close.pct_change()
Return['TSLA ' + 'value_stock'] = stocks.TSLA.Close.pct_change()
Return.head()
Out[51]:
AAPL value_stock AMZN value_stock NFLX value_stock GOOG value_stock TSLA value_stock
Date
2015-01-02 NaN NaN NaN NaN NaN
2015-01-05 -0.028172 -0.020517 -0.050897 -0.020846 -0.042041
2015-01-06 0.000094 -0.022833 -0.017121 -0.023177 0.005664
2015-01-07 0.014022 0.010600 0.005192 -0.001713 -0.001562
2015-01-08 0.038422 0.006836 0.022188 0.003153 -0.001564
In [52]:
Return.dropna(inplace = True)
Return.head()
Out[52]:
AAPL value_stock AMZN value_stock NFLX value_stock GOOG value_stock TSLA value_stock
Date
2015-01-05 -0.028172 -0.020517 -0.050897 -0.020846 -0.042041
2015-01-06 0.000094 -0.022833 -0.017121 -0.023177 0.005664
2015-01-07 0.014022 0.010600 0.005192 -0.001713 -0.001562
2015-01-08 0.038422 0.006836 0.022188 0.003153 -0.001564
2015-01-09 0.001073 -0.011749 -0.015458 -0.012951 -0.018802

Figure out on what dates each stock had the best and worst single-day returns on returns data.

In [53]:
print('Dates each stock had the best single-day returns on returns data:')
Return.idxmax()
Dates each stock had the best single-day returns on returns data:
Out[53]:
AAPL value_stock    2020-03-13
AMZN value_stock    2015-04-24
NFLX value_stock    2016-10-18
GOOG value_stock    2015-07-17
TSLA value_stock    2020-02-03
dtype: object
In [54]:
print('Dates each stock had the worst single-day returns on returns data:')
Return.idxmin()
Dates each stock had the worst single-day returns on returns data:
Out[54]:
AAPL value_stock    2020-03-16
AMZN value_stock    2020-03-12
NFLX value_stock    2016-07-19
GOOG value_stock    2020-03-16
TSLA value_stock    2020-09-08
dtype: object

Take a look at the standard deviation of the returns, which stock would you classify as the riskiest over the entire time period? Which would you classify as the riskiest for the year 2020?

In [55]:
Return.std()
Out[55]:
AAPL value_stock    0.018680
AMZN value_stock    0.019519
NFLX value_stock    0.026743
GOOG value_stock    0.016961
TSLA value_stock    0.034746
dtype: float64
In [56]:
Return.reset_index().std()
Out[56]:
AAPL value_stock    0.018680
AMZN value_stock    0.019519
NFLX value_stock    0.026743
GOOG value_stock    0.016961
TSLA value_stock    0.034746
dtype: float64

Visualization:¶

Create a distribution plot of the 2020 returns for each stock.

AAPL value_stock in 2020

In [57]:
sns.distplot(Return.loc['2020-01-01':'2020-12-31']['AAPL value_stock'],bins=100).set(title = "The distribution plot of the 2020 returns for AAPL stock")
display()

AMZN value_stock in 2020

In [58]:
sns.distplot(Return.loc['2020-01-01':'2020-12-31']['AMZN value_stock'],color = 'green',bins=100).set(title = "The distribution plot of the 2020 returns for AMZN stock")
display()

NFLX value_stock in 2020

In [59]:
sns.distplot(Return.loc['2020-01-01':'2020-12-31']['NFLX value_stock'],color='red',bins=100).set(title = "The distribution plot of the 2020 returns for NFLX stock")
display()

GOOG value_stock in 2020

In [60]:
sns.distplot(Return.loc['2020-01-01':'2020-12-31']['GOOG value_stock'],color='brown',bins=100).set(title = "The distribution plot of the 2020 returns for GOOG stock")
display()

TSLA value_stock in 2020

In [61]:
sns.distplot(Return.loc['2020-01-01':'2020-12-31']['TSLA value_stock'],color='purple',bins=100).set(title = "The distribution plot of the 2020 returns for TSLA stock")
display()

Create a line plot showing the Close price for each stock for the entire index of time.

In [62]:
stocks.xs('Close', level='Stock Info', axis = 1).plot(figsize=(12,4)).set(title = "The line plot showing the Close price for each stock for the entire index of time")
display()

Data Insights:¶

In [63]:
#pip install xgboost
In [64]:
#pip install keras
In [65]:
#pip install tensorflow
In [66]:
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from xgboost import XGBClassifier
from sklearn import metrics
from sklearn.preprocessing import MinMaxScaler

from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.layers import Dropout

AAPL¶

In [67]:
AAPL.index = AAPL.Date
AAPL = AAPL.drop(['Date', 'Adj Close'], axis = 1)
In [68]:
AAPL.loc['2015-01-02':'2019-12-31'].to_csv('trainAAPL.csv', index = False)
AAPL.loc['2019-12-31':].to_csv('testAAPL.csv', index = False)
In [69]:
AAPL_train = pd.read_csv('trainAAPL.csv')
AAPL_train = AAPL_train.iloc[:, 1:2].values
print(AAPL_train.shape)
(1258, 1)
In [70]:
scaler = MinMaxScaler(feature_range = (0,1))
scaled_training_set = scaler.fit_transform(AAPL_train)
scaled_training_set
Out[70]:
array([[0.09772617],
       [0.08393475],
       [0.0779041 ],
       ...,
       [1.        ],
       [0.99367278],
       [0.99856645]])
In [71]:
X_train = []
y_train = []

for i in range(60, len(AAPL_train)):
    X_train.append(scaled_training_set[i-60:i, 0])
    y_train.append(scaled_training_set[i, 0])
X_train = np.array(X_train)
y_train = np.array(y_train)
print(X_train.shape)
print(y_train.shape)
(1198, 60)
(1198,)
In [72]:
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_train.shape
Out[72]:
(1198, 60, 1)
In [73]:
regressor = Sequential()

regressor.add(LSTM(units = 60, return_sequences = True, input_shape = (X_train.shape[1], X_train.shape[2])))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60))
regressor.add(Dropout(0.2))

regressor.add(Dense(units = 1))
In [74]:
regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)
Epoch 1/100
38/38 [==============================] - 9s 57ms/step - loss: 0.0189
Epoch 2/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0035
Epoch 3/100
38/38 [==============================] - 2s 58ms/step - loss: 0.0031
Epoch 4/100
38/38 [==============================] - 2s 57ms/step - loss: 0.0027
Epoch 5/100
38/38 [==============================] - 2s 58ms/step - loss: 0.0028
Epoch 6/100
38/38 [==============================] - 2s 58ms/step - loss: 0.0030
Epoch 7/100
38/38 [==============================] - 2s 58ms/step - loss: 0.0024
Epoch 8/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0033
Epoch 9/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0027
Epoch 10/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0023
Epoch 11/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0021
Epoch 12/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0020
Epoch 13/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0020
Epoch 14/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0019
Epoch 15/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0020
Epoch 16/100
38/38 [==============================] - 3s 71ms/step - loss: 0.0021
Epoch 17/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0024
Epoch 18/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0017
Epoch 19/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0018
Epoch 20/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0018
Epoch 21/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0018
Epoch 22/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0017
Epoch 23/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0018
Epoch 24/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0015
Epoch 25/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0016
Epoch 26/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0016
Epoch 27/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0017
Epoch 28/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0015
Epoch 29/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0015
Epoch 30/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0014
Epoch 31/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0014
Epoch 32/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0015
Epoch 33/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0013
Epoch 34/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0014
Epoch 35/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0012
Epoch 36/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0013
Epoch 37/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0012
Epoch 38/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0014
Epoch 39/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0012
Epoch 40/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0013
Epoch 41/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0014
Epoch 42/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0014
Epoch 43/100
38/38 [==============================] - 2s 66ms/step - loss: 0.0014
Epoch 44/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0012
Epoch 45/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0011
Epoch 46/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0011
Epoch 47/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0010
Epoch 48/100
38/38 [==============================] - 2s 66ms/step - loss: 0.0011
Epoch 49/100
38/38 [==============================] - 3s 71ms/step - loss: 0.0011
Epoch 50/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0011
Epoch 51/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0013
Epoch 52/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0012
Epoch 53/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0011
Epoch 54/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0013
Epoch 55/100
38/38 [==============================] - 3s 71ms/step - loss: 9.5305e-04
Epoch 56/100
38/38 [==============================] - 3s 67ms/step - loss: 9.6441e-04
Epoch 57/100
38/38 [==============================] - 2s 64ms/step - loss: 9.6301e-04
Epoch 58/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0011
Epoch 59/100
38/38 [==============================] - 2s 61ms/step - loss: 9.2438e-04
Epoch 60/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0012
Epoch 61/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0012
Epoch 62/100
38/38 [==============================] - 3s 71ms/step - loss: 0.0011
Epoch 63/100
38/38 [==============================] - 2s 64ms/step - loss: 9.9712e-04
Epoch 64/100
38/38 [==============================] - 2s 64ms/step - loss: 9.5648e-04
Epoch 65/100
38/38 [==============================] - 2s 65ms/step - loss: 9.9899e-04
Epoch 66/100
38/38 [==============================] - 2s 63ms/step - loss: 8.9274e-04
Epoch 67/100
38/38 [==============================] - 2s 62ms/step - loss: 9.2956e-04
Epoch 68/100
38/38 [==============================] - 2s 66ms/step - loss: 9.4015e-04
Epoch 69/100
38/38 [==============================] - 2s 65ms/step - loss: 9.0565e-04
Epoch 70/100
38/38 [==============================] - 2s 61ms/step - loss: 9.6534e-04
Epoch 71/100
38/38 [==============================] - 2s 61ms/step - loss: 9.3712e-04
Epoch 72/100
38/38 [==============================] - 2s 64ms/step - loss: 8.9996e-04
Epoch 73/100
38/38 [==============================] - 3s 66ms/step - loss: 8.9270e-04
Epoch 74/100
38/38 [==============================] - 2s 65ms/step - loss: 8.9639e-04
Epoch 75/100
38/38 [==============================] - 3s 73ms/step - loss: 8.9517e-04
Epoch 76/100
38/38 [==============================] - 3s 67ms/step - loss: 8.3268e-04
Epoch 77/100
38/38 [==============================] - 2s 64ms/step - loss: 7.8343e-04
Epoch 78/100
38/38 [==============================] - 3s 69ms/step - loss: 8.3671e-04
Epoch 79/100
38/38 [==============================] - 3s 78ms/step - loss: 8.7742e-04
Epoch 80/100
38/38 [==============================] - 3s 71ms/step - loss: 8.2586e-04
Epoch 81/100
38/38 [==============================] - 3s 81ms/step - loss: 8.4001e-04
Epoch 82/100
38/38 [==============================] - 3s 83ms/step - loss: 0.0011
Epoch 83/100
38/38 [==============================] - 3s 86ms/step - loss: 9.3486e-04
Epoch 84/100
38/38 [==============================] - 3s 74ms/step - loss: 7.9684e-04
Epoch 85/100
38/38 [==============================] - 2s 64ms/step - loss: 8.9785e-04
Epoch 86/100
38/38 [==============================] - 3s 76ms/step - loss: 9.6299e-04
Epoch 87/100
38/38 [==============================] - 3s 78ms/step - loss: 7.8466e-04
Epoch 88/100
38/38 [==============================] - 2s 65ms/step - loss: 8.4333e-04
Epoch 89/100
38/38 [==============================] - 2s 63ms/step - loss: 8.5974e-04
Epoch 90/100
38/38 [==============================] - 2s 63ms/step - loss: 8.7955e-04
Epoch 91/100
38/38 [==============================] - 2s 61ms/step - loss: 8.6807e-04
Epoch 92/100
38/38 [==============================] - 2s 65ms/step - loss: 8.0630e-04
Epoch 93/100
38/38 [==============================] - 3s 67ms/step - loss: 7.5979e-04
Epoch 94/100
38/38 [==============================] - 2s 63ms/step - loss: 8.0772e-04
Epoch 95/100
38/38 [==============================] - 2s 65ms/step - loss: 8.2527e-04
Epoch 96/100
38/38 [==============================] - 2s 60ms/step - loss: 7.3097e-04
Epoch 97/100
38/38 [==============================] - 2s 62ms/step - loss: 8.3629e-04
Epoch 98/100
38/38 [==============================] - 2s 61ms/step - loss: 8.0500e-04
Epoch 99/100
38/38 [==============================] - 3s 68ms/step - loss: 8.3726e-04
Epoch 100/100
38/38 [==============================] - 3s 68ms/step - loss: 7.1209e-04
Out[74]:
<keras.callbacks.History at 0x29c7218dc70>
In [75]:
AAPL_test = pd.read_csv('testAAPL.csv')
actual_stock_price = AAPL_test.iloc[:, 1:2].values
In [76]:
AAPL_total = AAPL.Open
inputs = AAPL_total[len(AAPL_total) - len(AAPL_test) - 60:].values

inputs = inputs.reshape(-1, 1)
inputs = scaler.transform(inputs)

X_test = []
for i in range(60,len(AAPL_test)):
    X_test.append(inputs[i-60:i, 0])
    
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
In [77]:
predicted_stock_price = regressor.predict(X_test)
predicted_stock_price = scaler.inverse_transform(predicted_stock_price)
7/7 [==============================] - 2s 15ms/step
In [78]:
plt.plot(actual_stock_price, color = 'red', label = 'Actual AAPL stock price')
plt.plot(predicted_stock_price, color = 'blue', label = 'Predicted AAPL stock price')
plt.title('AAPL price prediction')
plt.ylabel('AAPL Stock Price')
plt.legend()
Out[78]:
<matplotlib.legend.Legend at 0x29c7eb18550>
In [79]:
metrics.explained_variance_score(actual_stock_price[:len(predicted_stock_price)], predicted_stock_price)
Out[79]:
0.9661198546185813

AMZN¶

In [80]:
AMZN.index = AMZN.Date
AMZN = AMZN.drop(['Date', 'Adj Close'], axis = 1)
In [81]:
AMZN.loc['2015-01-02':'2019-12-31'].to_csv('trainAMZN.csv', index = False)
AMZN.loc['2019-12-31':].to_csv('testAMZN.csv', index = False)
In [82]:
AMZN_train = pd.read_csv('trainAMZN.csv')
AMZN_train = AMZN_train.iloc[:, 1:2].values
print(AMZN_train.shape)
(1258, 1)
In [83]:
scaler = MinMaxScaler(feature_range = (0,1))
scaled_training_set = scaler.fit_transform(AMZN_train)
scaled_training_set
Out[83]:
array([[0.01361588],
       [0.00999597],
       [0.00693864],
       ...,
       [0.91527011],
       [0.90538208],
       [0.88791335]])
In [84]:
X_train = []
y_train = []
for i in range(60, len(AMZN_train)):
    X_train.append(scaled_training_set[i-60:i, 0])
    y_train.append(scaled_training_set[i, 0])
X_train = np.array(X_train)
y_train = np.array(y_train)
print(X_train.shape)
print(y_train.shape)
(1198, 60)
(1198,)
In [85]:
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_train.shape
Out[85]:
(1198, 60, 1)
In [86]:
regressor = Sequential()

regressor.add(LSTM(units = 60, return_sequences = True, input_shape = (X_train.shape[1],X_train.shape[2] )))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60))
regressor.add(Dropout(0.2))

regressor.add(Dense(units = 1))
In [87]:
regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)
Epoch 1/100
38/38 [==============================] - 9s 55ms/step - loss: 0.0421
Epoch 2/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0052
Epoch 3/100
38/38 [==============================] - 2s 56ms/step - loss: 0.0042
Epoch 4/100
38/38 [==============================] - 2s 66ms/step - loss: 0.0046
Epoch 5/100
38/38 [==============================] - 3s 80ms/step - loss: 0.0048
Epoch 6/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0039
Epoch 7/100
38/38 [==============================] - 3s 74ms/step - loss: 0.0040
Epoch 8/100
38/38 [==============================] - 3s 74ms/step - loss: 0.0047
Epoch 9/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0033
Epoch 10/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0029
Epoch 11/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0034
Epoch 12/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0037
Epoch 13/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0036
Epoch 14/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0033
Epoch 15/100
38/38 [==============================] - 3s 79ms/step - loss: 0.0033
Epoch 16/100
38/38 [==============================] - 3s 71ms/step - loss: 0.0030
Epoch 17/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0040
Epoch 18/100
38/38 [==============================] - 3s 72ms/step - loss: 0.0035
Epoch 19/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0027
Epoch 20/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0028
Epoch 21/100
38/38 [==============================] - 3s 77ms/step - loss: 0.0029
Epoch 22/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0027
Epoch 23/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0027
Epoch 24/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0026
Epoch 25/100
38/38 [==============================] - 3s 78ms/step - loss: 0.0025
Epoch 26/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0025
Epoch 27/100
38/38 [==============================] - 3s 82ms/step - loss: 0.0024
Epoch 28/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0026
Epoch 29/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0026
Epoch 30/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0023
Epoch 31/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0025
Epoch 32/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0025
Epoch 33/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0023
Epoch 34/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0025
Epoch 35/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0025
Epoch 36/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0025
Epoch 37/100
38/38 [==============================] - 3s 73ms/step - loss: 0.0028
Epoch 38/100
38/38 [==============================] - 3s 76ms/step - loss: 0.0025
Epoch 39/100
38/38 [==============================] - 3s 82ms/step - loss: 0.0022
Epoch 40/100
38/38 [==============================] - 3s 71ms/step - loss: 0.0020
Epoch 41/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0023
Epoch 42/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0022
Epoch 43/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0019
Epoch 44/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0020
Epoch 45/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0021
Epoch 46/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0022
Epoch 47/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0025
Epoch 48/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0020
Epoch 49/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0021
Epoch 50/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0019
Epoch 51/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0022
Epoch 52/100
38/38 [==============================] - 3s 73ms/step - loss: 0.0021
Epoch 53/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0017
Epoch 54/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0020
Epoch 55/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0023
Epoch 56/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0019
Epoch 57/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0023
Epoch 58/100
38/38 [==============================] - 3s 72ms/step - loss: 0.0017
Epoch 59/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0018
Epoch 60/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0021
Epoch 61/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0018
Epoch 62/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0016
Epoch 63/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0020
Epoch 64/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0018
Epoch 65/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0020
Epoch 66/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0015
Epoch 67/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0017
Epoch 68/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0016
Epoch 69/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0017
Epoch 70/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0018
Epoch 71/100
38/38 [==============================] - 3s 71ms/step - loss: 0.0017
Epoch 72/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0017
Epoch 73/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0015
Epoch 74/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0016
Epoch 75/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0016
Epoch 76/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0019
Epoch 77/100
38/38 [==============================] - 3s 72ms/step - loss: 0.0015
Epoch 78/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0014
Epoch 79/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0015
Epoch 80/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0018
Epoch 81/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0016
Epoch 82/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0015
Epoch 83/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0013
Epoch 84/100
38/38 [==============================] - 3s 72ms/step - loss: 0.0015
Epoch 85/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0014
Epoch 86/100
38/38 [==============================] - 2s 66ms/step - loss: 0.0013
Epoch 87/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0013
Epoch 88/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0015
Epoch 89/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0016
Epoch 90/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0015
Epoch 91/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0014
Epoch 92/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0012
Epoch 93/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0017
Epoch 94/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0015
Epoch 95/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0016
Epoch 96/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0013
Epoch 97/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0013
Epoch 98/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0012
Epoch 99/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0012
Epoch 100/100
38/38 [==============================] - 2s 66ms/step - loss: 0.0014
Out[87]:
<keras.callbacks.History at 0x29c7f2caa90>
In [88]:
AMZN_test = pd.read_csv('testAMZN.csv')
actual_stock_price = AMZN_test.iloc[:, 1:2].values
In [89]:
AMZN_total = AMZN.Open
inputs = AMZN_total[len(AMZN_total) - len(AMZN_test) - 60:].values

inputs = inputs.reshape(-1, 1)
inputs = scaler.transform(inputs)

X_test = []
for i in range(60,len(AMZN_test)):
    X_test.append(inputs[i-60:i, 0])
    
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
In [90]:
predicted_stock_price = regressor.predict(X_test)
predicted_stock_price = scaler.inverse_transform(predicted_stock_price)
7/7 [==============================] - 1s 22ms/step
In [91]:
plt.plot(actual_stock_price, color = 'red', label = 'Actual AMZN stock price')
plt.plot(predicted_stock_price, color = 'blue', label = 'Predicted AMZN stock price')
plt.title('AMZN price prediction')
plt.ylabel('AMZN Stock Price')
plt.legend()
Out[91]:
<matplotlib.legend.Legend at 0x29c0b619be0>
In [92]:
metrics.explained_variance_score(actual_stock_price[:len(predicted_stock_price)], predicted_stock_price)
Out[92]:
0.7532163626972936

NFLX¶

In [93]:
NFLX.index = NFLX.Date
NFLX = NFLX.drop(['Date', 'Adj Close'], axis = 1)
In [94]:
NFLX.loc['2015-01-02':'2019-12-31'].to_csv('trainNFLX.csv', index = False)
NFLX.loc['2019-12-31':].to_csv('testNFLX.csv', index = False)
In [95]:
NFLX_train = pd.read_csv('trainNFLX.csv')
NFLX_train = NFLX_train.iloc[:, 1:2].values
print(NFLX_train.shape)
(1258, 1)
In [96]:
scaler = MinMaxScaler(feature_range = (0,1))
scaled_training_set = scaler.fit_transform(NFLX_train)
scaled_training_set
Out[96]:
array([[0.00941947],
       [0.00656934],
       [0.00226948],
       ...,
       [0.76252864],
       [0.75022868],
       [0.73888513]])
In [97]:
X_train = []
y_train = []
for i in range(60, len(NFLX_train)):
    X_train.append(scaled_training_set[i-60:i, 0])
    y_train.append(scaled_training_set[i, 0])
X_train = np.array(X_train)
y_train = np.array(y_train)
print(X_train.shape)
print(y_train.shape)
(1198, 60)
(1198,)
In [98]:
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_train.shape
Out[98]:
(1198, 60, 1)
In [99]:
regressor = Sequential()

regressor.add(LSTM(units = 60, return_sequences = True, input_shape = (X_train.shape[1], X_train.shape[2])))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60))
regressor.add(Dropout(0.2))

regressor.add(Dense(units = 1))
In [100]:
regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)
Epoch 1/100
38/38 [==============================] - 9s 58ms/step - loss: 0.0386
Epoch 2/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0059
Epoch 3/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0048
Epoch 4/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0049
Epoch 5/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0050
Epoch 6/100
38/38 [==============================] - 3s 75ms/step - loss: 0.0043
Epoch 7/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0041
Epoch 8/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0038
Epoch 9/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0036
Epoch 10/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0038
Epoch 11/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0041
Epoch 12/100
38/38 [==============================] - 3s 73ms/step - loss: 0.0042
Epoch 13/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0030
Epoch 14/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0033
Epoch 15/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0031
Epoch 16/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0030
Epoch 17/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0037
Epoch 18/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0032
Epoch 19/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0030
Epoch 20/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0032
Epoch 21/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0028
Epoch 22/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0030
Epoch 23/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0030
Epoch 24/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0029
Epoch 25/100
38/38 [==============================] - 3s 77ms/step - loss: 0.0030
Epoch 26/100
38/38 [==============================] - 3s 74ms/step - loss: 0.0032
Epoch 27/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0025
Epoch 28/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0025
Epoch 29/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0029
Epoch 30/100
38/38 [==============================] - 2s 66ms/step - loss: 0.0023
Epoch 31/100
38/38 [==============================] - 3s 73ms/step - loss: 0.0027
Epoch 32/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0025
Epoch 33/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0027
Epoch 34/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0030
Epoch 35/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0025
Epoch 36/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0022
Epoch 37/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0023
Epoch 38/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0023
Epoch 39/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0025
Epoch 40/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0024
Epoch 41/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0025
Epoch 42/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0026
Epoch 43/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0022
Epoch 44/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0021
Epoch 45/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0020
Epoch 46/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0020
Epoch 47/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0021
Epoch 48/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0022
Epoch 49/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0021
Epoch 50/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0019
Epoch 51/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0019
Epoch 52/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0023
Epoch 53/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0019
Epoch 54/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0020
Epoch 55/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0018
Epoch 56/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0018
Epoch 57/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0017
Epoch 58/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0018
Epoch 59/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0019
Epoch 60/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0016
Epoch 61/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0019
Epoch 62/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0017
Epoch 63/100
38/38 [==============================] - 3s 72ms/step - loss: 0.0017
Epoch 64/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0017
Epoch 65/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0016
Epoch 66/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0015
Epoch 67/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0016
Epoch 68/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0019
Epoch 69/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0015
Epoch 70/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0014
Epoch 71/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0016
Epoch 72/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0015
Epoch 73/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0013
Epoch 74/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0019
Epoch 75/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0014
Epoch 76/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0013
Epoch 77/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0013
Epoch 78/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0014
Epoch 79/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0013
Epoch 80/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0013
Epoch 81/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0015
Epoch 82/100
38/38 [==============================] - 3s 72ms/step - loss: 0.0014
Epoch 83/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0014
Epoch 84/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0013
Epoch 85/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0013
Epoch 86/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0013
Epoch 87/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0013
Epoch 88/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0012
Epoch 89/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0013
Epoch 90/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0013
Epoch 91/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0013
Epoch 92/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0012
Epoch 93/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0012
Epoch 94/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0013
Epoch 95/100
38/38 [==============================] - 3s 73ms/step - loss: 0.0013
Epoch 96/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0013
Epoch 97/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0012
Epoch 98/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0011
Epoch 99/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0012
Epoch 100/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0012
Out[100]:
<keras.callbacks.History at 0x29c0cc2fa60>
In [101]:
NFLX_test = pd.read_csv('testNFLX.csv')
actual_stock_price = NFLX_test.iloc[:, 1:2].values
In [102]:
NFLX_total = NFLX.Open
inputs = NFLX_total[len(NFLX_total) - len(NFLX_test) - 60:].values

inputs = inputs.reshape(-1, 1)
inputs = scaler.transform(inputs)

X_test = []
for i in range(60,len(NFLX_test)):
    X_test.append(inputs[i-60:i, 0])
    
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
In [103]:
predicted_stock_price = regressor.predict(X_test)
predicted_stock_price = scaler.inverse_transform(predicted_stock_price)
7/7 [==============================] - 1s 20ms/step
In [104]:
plt.plot(actual_stock_price, color = 'red', label = 'Actual NFLX stock price')
plt.plot(predicted_stock_price, color = 'blue', label = 'Predicted NFLX stock price')
plt.title('NFLX price prediction')
plt.ylabel('NFLX Stock Price')
plt.legend()
Out[104]:
<matplotlib.legend.Legend at 0x29c176b7670>
In [105]:
metrics.explained_variance_score(actual_stock_price[:len(predicted_stock_price)], predicted_stock_price)
Out[105]:
0.8724228613592165

GOOG¶

In [106]:
GOOG.index = GOOG.Date
GOOG = GOOG.drop(['Date', 'Adj Close'], axis = 1)
In [107]:
GOOG.loc['2015-01-02':'2019-12-31'].to_csv('trainGOOG.csv', index = False)
GOOG.loc['2019-12-31':].to_csv('testGOOG.csv', index = False)
In [108]:
GOOG_train = pd.read_csv('trainGOOG.csv')
GOOG_train = GOOG_train.iloc[:, 1:2].values
print(GOOG_train.shape)
(1258, 1)
In [109]:
scaler = MinMaxScaler(feature_range = (0,1))
scaled_training_set = scaler.fit_transform(GOOG_train)
scaled_training_set
Out[109]:
array([[0.04043898],
       [0.0324873 ],
       [0.02314352],
       ...,
       [0.99946003],
       [0.986213  ],
       [0.96897918]])
In [110]:
X_train = []
y_train = []
for i in range(60, len(GOOG_train)):
    X_train.append(scaled_training_set[i-60:i, 0])
    y_train.append(scaled_training_set[i, 0])
X_train = np.array(X_train)
y_train = np.array(y_train)
print(X_train.shape)
print(y_train.shape)
(1198, 60)
(1198,)
In [111]:
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_train.shape
Out[111]:
(1198, 60, 1)
In [112]:
regressor = Sequential()

regressor.add(LSTM(units = 60, return_sequences = True, input_shape = (X_train.shape[1], X_train.shape[2])))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60))
regressor.add(Dropout(0.2))

regressor.add(Dense(units = 1))
In [113]:
regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)
Epoch 1/100
38/38 [==============================] - 9s 60ms/step - loss: 0.0427
Epoch 2/100
38/38 [==============================] - 2s 54ms/step - loss: 0.0062
Epoch 3/100
38/38 [==============================] - 2s 54ms/step - loss: 0.0053
Epoch 4/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0047
Epoch 5/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0045
Epoch 6/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0041
Epoch 7/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0042
Epoch 8/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0044
Epoch 9/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0041
Epoch 10/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0036
Epoch 11/100
38/38 [==============================] - 3s 71ms/step - loss: 0.0037
Epoch 12/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0037
Epoch 13/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0036
Epoch 14/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0037
Epoch 15/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0036
Epoch 16/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0036
Epoch 17/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0035
Epoch 18/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0035
Epoch 19/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0045
Epoch 20/100
38/38 [==============================] - 2s 66ms/step - loss: 0.0040
Epoch 21/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0028
Epoch 22/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0030
Epoch 23/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0031
Epoch 24/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0035
Epoch 25/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0028
Epoch 26/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0027
Epoch 27/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0028
Epoch 28/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0026
Epoch 29/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0028
Epoch 30/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0029
Epoch 31/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0027
Epoch 32/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0027
Epoch 33/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0026
Epoch 34/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0028
Epoch 35/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0027
Epoch 36/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0027
Epoch 37/100
38/38 [==============================] - 3s 71ms/step - loss: 0.0026
Epoch 38/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0025
Epoch 39/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0025
Epoch 40/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0025
Epoch 41/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0023
Epoch 42/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0023
Epoch 43/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0028
Epoch 44/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0023
Epoch 45/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0022
Epoch 46/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0024
Epoch 47/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0025
Epoch 48/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0024
Epoch 49/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0023
Epoch 50/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0021
Epoch 51/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0021
Epoch 52/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0024
Epoch 53/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0022
Epoch 54/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0018
Epoch 55/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0022
Epoch 56/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0019
Epoch 57/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0019
Epoch 58/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0019
Epoch 59/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0020
Epoch 60/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0020
Epoch 61/100
38/38 [==============================] - 2s 58ms/step - loss: 0.0019
Epoch 62/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0018
Epoch 63/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0017
Epoch 64/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0018
Epoch 65/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0018
Epoch 66/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0018
Epoch 67/100
38/38 [==============================] - 2s 58ms/step - loss: 0.0018
Epoch 68/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0017
Epoch 69/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0018
Epoch 70/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0018
Epoch 71/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0018
Epoch 72/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0021
Epoch 73/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0016
Epoch 74/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0016
Epoch 75/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0016
Epoch 76/100
38/38 [==============================] - 2s 58ms/step - loss: 0.0017
Epoch 77/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0019
Epoch 78/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0016
Epoch 79/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0017
Epoch 80/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0015
Epoch 81/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0015
Epoch 82/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0017
Epoch 83/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0016
Epoch 84/100
38/38 [==============================] - 3s 73ms/step - loss: 0.0016
Epoch 85/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0016
Epoch 86/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0015
Epoch 87/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0019
Epoch 88/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0014
Epoch 89/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0014
Epoch 90/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0014
Epoch 91/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0014
Epoch 92/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0012
Epoch 93/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0013
Epoch 94/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0013
Epoch 95/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0016
Epoch 96/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0015
Epoch 97/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0012
Epoch 98/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0012
Epoch 99/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0013
Epoch 100/100
38/38 [==============================] - 3s 73ms/step - loss: 0.0012
Out[113]:
<keras.callbacks.History at 0x29c18d1cbb0>
In [114]:
GOOG_test = pd.read_csv('testGOOG.csv')
actual_stock_price = GOOG_test.iloc[:, 1:2].values
In [115]:
GOOG_total = GOOG.Open
inputs = GOOG_total[len(GOOG_total) - len(GOOG_test) - 60:].values

inputs = inputs.reshape(-1, 1)
inputs = scaler.transform(inputs)

X_test = []
for i in range(60,len(GOOG_test)):
    X_test.append(inputs[i-60:i, 0])
    
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
In [116]:
predicted_stock_price = regressor.predict(X_test)
predicted_stock_price = scaler.inverse_transform(predicted_stock_price)
7/7 [==============================] - 1s 21ms/step
In [117]:
plt.plot(actual_stock_price, color = 'red', label = 'Actual GOOG stock price')
plt.plot(predicted_stock_price, color = 'blue', label = 'Predicted GOOG stock price')
plt.title('GOOG price prediction')
plt.ylabel('GOOG Stock Price')
plt.legend()
Out[117]:
<matplotlib.legend.Legend at 0x29c23b0b5e0>
In [118]:
metrics.explained_variance_score(actual_stock_price[:len(predicted_stock_price)], predicted_stock_price)
Out[118]:
0.9208285706423892

TSLA¶

In [119]:
TSLA.index = TSLA.Date
TSLA = TSLA.drop(['Date', 'Adj Close'], axis = 1)
In [120]:
TSLA.loc['2015-01-02':'2019-12-31'].to_csv('trainTSLA.csv', index = False)
TSLA.loc['2019-12-31':].to_csv('testTSLA.csv', index = False)
In [121]:
TSLA_train = pd.read_csv('trainTSLA.csv')
TSLA_train = TSLA_train.iloc[:, 1:2].values
print(TSLA_train.shape)
(1258, 1)
In [122]:
scaler = MinMaxScaler(feature_range = (0,1))
scaled_training_set = scaler.fit_transform(TSLA_train)
scaled_training_set
Out[122]:
array([[0.24356139],
       [0.21948349],
       [0.21127918],
       ...,
       [1.        ],
       [0.97749165],
       [0.94998933]])
In [123]:
X_train = []
y_train = []
for i in range(60, len(TSLA_train)):
    X_train.append(scaled_training_set[i-60:i, 0])
    y_train.append(scaled_training_set[i, 0])
X_train = np.array(X_train)
y_train = np.array(y_train)
print(X_train.shape)
print(y_train.shape)
(1198, 60)
(1198,)
In [124]:
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_train.shape
Out[124]:
(1198, 60, 1)
In [125]:
regressor = Sequential()

regressor.add(LSTM(units = 60, return_sequences = True, input_shape = (X_train.shape[1], X_train.shape[2])))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 60))
regressor.add(Dropout(0.2))

regressor.add(Dense(units = 1))
In [126]:
regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)
Epoch 1/100
38/38 [==============================] - 9s 57ms/step - loss: 0.0317
Epoch 2/100
38/38 [==============================] - 2s 54ms/step - loss: 0.0098
Epoch 3/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0088
Epoch 4/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0088
Epoch 5/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0084
Epoch 6/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0069
Epoch 7/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0069
Epoch 8/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0067
Epoch 9/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0067
Epoch 10/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0058
Epoch 11/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0055
Epoch 12/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0051
Epoch 13/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0046
Epoch 14/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0046
Epoch 15/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0047
Epoch 16/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0043
Epoch 17/100
38/38 [==============================] - 2s 58ms/step - loss: 0.0045
Epoch 18/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0043
Epoch 19/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0044
Epoch 20/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0041
Epoch 21/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0037
Epoch 22/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0036
Epoch 23/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0034
Epoch 24/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0034
Epoch 25/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0035
Epoch 26/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0035
Epoch 27/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0034
Epoch 28/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0032
Epoch 29/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0032
Epoch 30/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0031
Epoch 31/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0033
Epoch 32/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0029
Epoch 33/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0030
Epoch 34/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0029
Epoch 35/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0026
Epoch 36/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0029
Epoch 37/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0030
Epoch 38/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0029
Epoch 39/100
38/38 [==============================] - 3s 71ms/step - loss: 0.0025
Epoch 40/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0027
Epoch 41/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0026
Epoch 42/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0024
Epoch 43/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0022
Epoch 44/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0023
Epoch 45/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0023
Epoch 46/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0022
Epoch 47/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0022
Epoch 48/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0023
Epoch 49/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0021
Epoch 50/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0022
Epoch 51/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0023
Epoch 52/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0024
Epoch 53/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0021
Epoch 54/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0020
Epoch 55/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0021
Epoch 56/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0020
Epoch 57/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0019
Epoch 58/100
38/38 [==============================] - 3s 73ms/step - loss: 0.0022
Epoch 59/100
38/38 [==============================] - 3s 74ms/step - loss: 0.0021
Epoch 60/100
38/38 [==============================] - 3s 82ms/step - loss: 0.0020
Epoch 61/100
38/38 [==============================] - 3s 73ms/step - loss: 0.0016
Epoch 62/100
38/38 [==============================] - 3s 68ms/step - loss: 0.0019
Epoch 63/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0018
Epoch 64/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0018
Epoch 65/100
38/38 [==============================] - 3s 74ms/step - loss: 0.0018
Epoch 66/100
38/38 [==============================] - 3s 75ms/step - loss: 0.0018
Epoch 67/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0016
Epoch 68/100
38/38 [==============================] - 3s 75ms/step - loss: 0.0017
Epoch 69/100
38/38 [==============================] - 2s 65ms/step - loss: 0.0017
Epoch 70/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0017
Epoch 71/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0017
Epoch 72/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0017
Epoch 73/100
38/38 [==============================] - 2s 66ms/step - loss: 0.0016
Epoch 74/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0015
Epoch 75/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0016
Epoch 76/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0015
Epoch 77/100
38/38 [==============================] - 3s 69ms/step - loss: 0.0014
Epoch 78/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0015
Epoch 79/100
38/38 [==============================] - 2s 62ms/step - loss: 0.0015
Epoch 80/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0018
Epoch 81/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0015
Epoch 82/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0016
Epoch 83/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0016
Epoch 84/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0014
Epoch 85/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0015
Epoch 86/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0014
Epoch 87/100
38/38 [==============================] - 3s 66ms/step - loss: 0.0012
Epoch 88/100
38/38 [==============================] - 3s 67ms/step - loss: 0.0014
Epoch 89/100
38/38 [==============================] - 2s 63ms/step - loss: 0.0014
Epoch 90/100
38/38 [==============================] - 3s 71ms/step - loss: 0.0015
Epoch 91/100
38/38 [==============================] - 2s 64ms/step - loss: 0.0014
Epoch 92/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0014
Epoch 93/100
38/38 [==============================] - 2s 59ms/step - loss: 0.0014
Epoch 94/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0014
Epoch 95/100
38/38 [==============================] - 2s 60ms/step - loss: 0.0013
Epoch 96/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0014
Epoch 97/100
38/38 [==============================] - 3s 70ms/step - loss: 0.0013
Epoch 98/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0012
Epoch 99/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0013
Epoch 100/100
38/38 [==============================] - 2s 61ms/step - loss: 0.0014
Out[126]:
<keras.callbacks.History at 0x29c24b08640>
In [127]:
TSLA_test = pd.read_csv('testTSLA.csv')
actual_stock_price = TSLA_test.iloc[:, 1:2].values
In [128]:
TSLA_total = TSLA.Open
inputs = TSLA_total[len(TSLA_total) - len(TSLA_test) - 60:].values

inputs = inputs.reshape(-1, 1)
inputs = scaler.transform(inputs)

X_test = []
for i in range(60,len(TSLA_test)):
    X_test.append(inputs[i-60:i, 0])
    
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
In [129]:
predicted_stock_price = regressor.predict(X_test)
predicted_stock_price = scaler.inverse_transform(predicted_stock_price)
7/7 [==============================] - 1s 17ms/step
In [130]:
plt.plot(actual_stock_price, color = 'red', label = 'Actual TSLA stock price')
plt.plot(predicted_stock_price, color = 'blue', label = 'Predicted TSLA stock price')
plt.title('TSLA price prediction')
plt.ylabel('TSLA Stock Price')
plt.legend()
Out[130]:
<matplotlib.legend.Legend at 0x29c2fb8c640>
In [131]:
metrics.explained_variance_score(actual_stock_price[:len(predicted_stock_price)], predicted_stock_price)
Out[131]:
0.4045991191183884